嗨大家今天過得好嗎?昨天了解了 Facebook 推出的 Shimmer library 簡單的使用方式,只需要 ShimmerFrameLayout 加上 place holder 兩種 layout 很簡單,但 place holder 的問題是不同頁面的列表起始高度並不同,有些頁面除了 Toolbar 外還會有其他的元件所以就要另外設定各個頁面的列表起始高度,另外看似簡單的 ShimmerFrameLayout 好像只要供在 Activity 的 layout 再叫他做事就好,但也代表 layout 的 View hirerachy 又多了一層,繪製 layout 的時間又變得更久了!工程師就是懶惰,有沒有不改動 Code base 也能達成 Skelton 的目的呢?你可以改選擇 Skelton library!
雖然 Skelton 和 Shimmer 兩個 library 都需要另外寫 place holder layout ( 原來誤會 Skelton 神通廣大到可以直接拿 ViewHolder 的 layout 來用,但想想不對啊,原來 ViewHolder 都沒有設定顯示文字成灰底長條背景,那到底要叫 Skelton 怎麼辦到? ),但不同的是我們不用像 Shimmer 一樣在不同頁面煩惱 RecyclerView 的起始高度不同,Skelton 是值接綁定 RecyclerView 和 RecyclerView.Adapter 的,綁定後會產生 RecyclerViewSkeletonScreen 再去呼叫 show() 或是 hide() 的 method 就可以控制動畫開始和動畫消失。
也許有些頁面並不是列表但也想要在載入前顯示 shimmer 的效果,Skelton 也有處理頁面的綁定,針對頁面的 rootView 綁定 place holder layout 後也是用 show() 和 hide() 控制。Skelton library 的另外一個優點是不用在 View hirerachy 中另外塞入一個元件,只要在原來的 layout 中直接綁定 RecyclerView 就好了,和原來的 Code base 比較兼容。
但 Shimmer 和 Skelton 都要另外為了 place holder 新增 layout,有沒有辦法讓 library 直接根據 ViewHolder 產生 place holder layout 呢?還有第三種選擇 Skelton Android。
為了達到不要另外產生一份 place holder 的 XML,Skelton Android 的實現方式是要讓 Adapter 繼承自 AdapterSkeleton,而 AdapterSkelton 當然沒有那麼神可以知道 View 的高度,因此就要在 ViewHolder 的 layout 中加上 SkeltonVIew 並把每個元件包起來,長寬都使用 wrap_content 的設定才能知道每個元件的高度。休淡幾勒,我這是省了 place holder 的畫面但是把成本都轉嫁到 ViewHolder 身上啊!果然天下沒有白吃的午餐,該是誰做的事就不能偷懶。
這次找資料才發現做 Skelton 效果的 library 真的很多,但實現方法卻因 library 而有很大差異,光是 Shimmer、Skelton 和 Skelton Android 的用法就差很多,三者比較下來我覺得 Skelton 真的比較輕量也不會對 code base 有太大的改動,但每個專案的架構都不同,也許可以多了解各個 library 後再選擇比較適合的,也歡迎有推薦不錯的 library 可以留言分享喔!如果喜歡今天分享的內容的邦友請繼續關注「打造一個厲害的普通 Android App - 使用者體驗優化」的主題,我們明天見。